#include "operacionEstadistica.h"

std::string OperacionEstadistica::NOMBRE_PARAM_ESTADISTICA = "ESTADISTICA";

OperacionEstadistica::OperacionEstadistica(std::string &archivo){
	this->nombre_archivo = archivo;	
}

OperacionEstadistica::~OperacionEstadistica(){}

Operacion * OperacionEstadistica::construir(std::string param){
	Operacion * _return = NULL;
	if (Parser::procesar_nombre_operacion(param,NOMBRE_PARAM_ESTADISTICA)){
		//si tiene los params que necesita la estadistica y es del tipo
		std::vector<std::string> params = Parser::split_parametros(param, ';');
		if( params.size() == 1){
			std::string nombre_archivo;
			nombre_archivo = Parser::procesar_nombre(params[0]);//reviso el nombre del archivo
			//creo la estadistica
			_return = new OperacionEstadistica(nombre_archivo);
		}
	}
	return _return;
}
		
void OperacionEstadistica::ejecutar(Modelo *modelo){
	try{
		ArchivoDatos& arch = modelo->get_archivo(nombre_archivo);
		
		std::string mensaje = "Ejecuto una estadistica sobre " + this->nombre_archivo ;
	
		//declaro las variables. Mas legible el codigo.
		unsigned int tam_arch = arch.get_tam();
		unsigned int tam_ind = arch.get_tam_arch_indice();
		unsigned int tam_ind_sec = arch.get_tam_ind_sec();
		unsigned int tam_libre_arch = arch.get_espacio_libre();
		unsigned int tam_libre_ind = arch.get_esp_libre_indice();
		unsigned int tam_libre_ind_sec = arch.get_esp_libre_ind_sec();
		unsigned int cant_regs_arch = arch.get_cant_regs();
		unsigned int cant_regs_ind = arch.get_cant_regs_indice();
		unsigned int cant_regs_ind_sec = arch.get_cant_regs_ind_sec();
		
		unsigned int tam_ocupado = tam_arch - tam_libre_arch;
		unsigned int tam_ocup_ind = tam_ind - tam_libre_ind ;
		unsigned int tam_ocup_ind_sec = tam_ind_sec - tam_libre_ind_sec;
		unsigned int tam_ocup_neto = tam_ocupado + tam_ocup_ind + tam_ocup_ind_sec;
		
		std::stringstream ss;
		
		std::string resultado;
		
		resultado = "OCUPADO\n";
		resultado.append("\t Datos:  ");
		ss.str("");
		ss << (tam_ocupado);
		resultado += ss.str();
		
		resultado.append("\n\t Indice: ");
		ss.str("");
		ss << (tam_ocup_ind);
		resultado += ss.str();
		
		resultado.append("\n\t Indice Sec: ");
		ss.str("");
		ss << (tam_ocup_ind_sec);
		resultado += ss.str();
		
		resultado.append("\n\t Neto:   ");
		ss.str("");
		ss << (tam_ocup_neto);
		resultado += ss.str();
		
		resultado.append("\nLIBRE\n");
		resultado.append("\t Datos:  ");
		ss.str("");
		ss << tam_libre_arch;
		resultado += ss.str();
		
		resultado.append("\n\t Indice: ");
		ss.str("");
		ss << tam_libre_ind;
		resultado += ss.str();
		
		resultado.append("\n\t Indice Sec: ");
		ss.str("");
		ss << tam_libre_ind_sec;
		resultado += ss.str();
		
		resultado.append("\n\t Neto:   ");
		ss.str("");
		ss << (tam_libre_arch + tam_libre_ind + tam_libre_ind_sec);
		resultado += ss.str();
		
		resultado.append("\nCANT REGS/ENTRADAS\n");
		resultado.append("\t Datos:  ");
		ss.str("");
		ss <<  cant_regs_arch;
		resultado += ss.str();
		
		resultado.append("\n\t Indice: ");
		ss.str("");
		ss <<  cant_regs_ind;
		resultado += ss.str();
		
		resultado.append("\n\t Indice Sec: ");
		ss.str("");
		ss <<  cant_regs_ind_sec;
		resultado += ss.str();
		
		(*Logger::get_instance()) << resultado;
		( Debug::get_instance() )->mostrar_mensaje(resultado);
		
	}catch (ExcepArchInexistente &e){
		std::string mensaje = "Error - Archivo inexistente. No se pudo ejecutar la estadistica. RES = 0";
		(*Logger::get_instance()) << mensaje;
		( Debug::get_instance() )->mostrar_mensaje(mensaje);
	}	
	
}
